/**
 * @file luogu/4826/main.cpp
 * @author Ruiming Guo (guoruiming@stu.scu.edu.cn)
 * @brief 一共有 n 头牛参加淘汰赛，每次比赛的分数为两头牛 id 的按位异或，
 * 每次比赛后淘汰一头牛，问最大的分数总和
 *
 * 1. 有 n 头牛
 * 2. 有 n-1 场比赛
 * 3. 对每一头牛，除了最后的赢家，有且仅有一头战胜自己的牛
 * 4. 最后的赢家没有战胜它的牛
 *
 * 很显然是树的性质，计算每两头牛之间比赛的分数，求最大生成树。
 *
 * @version 0.1
 * @date 2022-05-01
 *
 * @copyright Copyright (c) 2022
 *
 */
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 2010;
ll id[N];
int par[N * N];
struct edge {
  int u, v;
  ll cost;
  bool operator<(const edge &b) const { return cost > b.cost; }
};
vector<edge> match;
int n;
int find(int x) { return par[x] == x ? x : par[x] = find(par[x]); }
int main() {
  cin >> n;
  for (int i = 0; i < n; ++i) cin >> id[i];
  // 枚举，让牛两两比赛
  for (int i = 0; i < n; ++i) {
    for (int j = i + 1; j < n; ++j) {
      match.push_back({i, j, id[i] ^ id[j]});
    }
  }
  // Kruskal 最小生成树
  ll ans = 0;
  int cnt = 0;
  for (int i = 0; i < n * n; ++i) par[i] = i;
  sort(match.begin(), match.end());
  for (int i = 0; i < match.size(); ++i) {
    auto [u, v, cost] = match[i];
    u = find(u), v = find(v);
    if (u == v) continue;
    par[u] = v;
    ans += cost;
    cnt++;
    if (cnt == n - 1) break;
  }
  cout << ans << endl;
}
